#ifndef TRAYTOOLKIT_H
#define TRAYTOOLKIT_H

#include <math.h>
#include <QString>
#include <QDebug>
#include <QMessageBox>

#include "../mainWindow/defines.h"

using namespace std;

class TrayToolKit {

private:
  //Тип лотка
  int insType;

  //Переменные
  double insB;
  double insH;
  double insHr;
  double insM;
  double insI;
  double insIr;
  double insF;
  double insP;

  //Константы
  double insG;
  double insA;
  double insQ20;

  //Условия
  int insTypeConcrete;
  int insRegion;
  int insTypeUpside;
  int insTimeRain;
  int insClassConcrete;

  //Зависимые от условий переменные
  double insN;
  double insCn;
  double insMr;
  double insCy;
  double insZmid;
  double insKpf;
  double insKpt;
  double insHrain;
  double insVd;
  double insVs;
  double insVr;

public:
  TrayToolKit(int newType=DEFTRAYTYPE, double newB=DEFWIDTH, 
	      double newH=DEFHEIGHT,   double newM=DEFINCL, 
	      double newI=DEFHYDRINCL, double newF=DEFAREARUNNER, 
	      	     		       double newP=DEFLIMPERIOD);
  //Выставление типа
  int type();
  void setType(int newType);

  //Выставление переменных и констант
  double getVar(int nameVar);
  void 	 setVar(double newVal, int nameVar);

  //Размерность
  QString getDimVarHtml(int nameVar);
  QString getDimVarText(int nameVar);

  //Условия
  int environment(int nameVar);
  void setEnvironment(int newVal, int nameVar);

  //Обновление переменных при перемене условий
  void updateN();
  void updateCnMrCy();
  void updateZmid();
  void updateKpf();
  void updateKpt();
  void updateHrain();
  void updateVd();
  void updateVs();
  void updateVr();

  QString getNameClassConcrete();

//Площадь живого сечения
  double areaLiveProfile(double H = 0, double B = 0, double M = 0);
  double areaLiveProfile_cr();
  double areaLiveProfile_r();

//Смоченный периметр
  double moistenedPerimeter(double H = 0, double B = 0, double M = 0);
  double moistenedPerimeter_cr();
  double moistenedPerimeter_r();

//Гидравлический радиус
  double hydraulicRadius(double H = 0, double S = 0, double X = 0);
  double hydraulicRadius_cr();
  double hydraulicRadius_r();

//Коэффициент Шези
  double shezy(double H = 0, double R = 0, double N = 0);
  double shezy_cr();
  double shezy_r();

  //Максимальный расход воды
  double waterConsumption(double S = 0, double R = 0, double C = 0, double I = 0);

  //Расчетный расход воды
  double calcWaterConsumption(double S = 0, double R = 0, double C = 0, double Ir = 0);

  //Критический расход воды
  double crWaterConsumption(double S = 0, double R = 0, double C = 0, double I = 0);

  //Рекомендуемый расход воды
  double recWaterConsumption();

  //Рекомендуемая высота наполнения
  double recHeightTrapTray();

  //Критическая высота для прямоугольного лотка
  double crHeightRectTray(double Q = 0, double B = 0, double A = 0, double G = 0);

  //Критическая высота для условно трапецеидального лотка
  double crHeightTrapTray(double Hcrp = 0, double B = 0, double M = 0);

  //Ширина канала по урезу воды при критической глубине
  double widthForCrHeight(double Hcr = 0, double B = 0, double M = 0);

  //Критический гидравлический уклон
  double crHydraulicInclination(double Hcrp = 0, double Bcr = 0, double B = 0, double X = 0, 
				double C = 0, double M = 0, double G = 0, double A = 0);


  //Расчет коэффициента A (для q)
  double calcAQ(double P = 0, double Mr = 0, double Cy = 0, double Cn = 0, double Q20 = 0);

  //Расход дождевых вод
  double rainWaterConsumption(double P = 0, double F = 0, double TimeRain = 0, double Kpt = 0, double Kpf = 0, 
			      double Mr = 0, double Zmid = 0, double Cy = 0, double Cn = 0, double Q20 = 0);


}; //class class TrayToolKit

#endif
